package com.lihepeng.leecode.linkedList;

import org.junit.Test;

/**
 * 插入排序的动画演示如上。从第一个元素开始，该链表可以被认为已经部分排序（用黑色表示）。
 * 每次迭代时，从输入数据中移除一个元素（用红色表示），并原地将其插入到已排好序的链表中。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/insertion-sort-list
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Solution147 {
    // 2020年11月20日 每日一题
    public ListNode insertionSortList(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode dumpNode = new ListNode(-1);
        dumpNode.next = head;
        // 维护两个节点，一个是已经维护好顺序的节点，另外一个是当前正在排序的节点
        ListNode lastSortedNode = head, currNode = head.next;

        while (currNode != null) {
            // 判断当前节点是不是小于head节点，如果是，直接在后面进行插入
            // cur 应该为节点的后面，lastSorted 节点应该为当前的current节点
            if (lastSortedNode.value <= currNode.value) {
                lastSortedNode = lastSortedNode.next;
            } else {
                // 否则 ，应该是从头遍历节点 找到currentnode 的位置
                ListNode prev = dumpNode;
                while (prev.value <= currNode.value) {
                    prev = prev.next;
                }

                // 找到curr 节点的位置
                lastSortedNode.next = prev.next;
                currNode.next = prev.next;
                prev.next = currNode;
            }
            currNode = lastSortedNode.next;
        }
        return dumpNode.next;
    }

    @Test
    public void runTest() {

    }
}
